import http from '@ohos.net.http';
import Prompt from '@system.prompt';

export class Http {
  /**
   * post请求，同步
   */
  static async postSyncResolver<T>(url: string, data: any): Promise<T | undefined> {
    try {
      // 每一个httpRequest对应一个HTTP请求任务，不可复用
      let response = await http.createHttp().request(
        // 填写HTTP请求的URL地址，可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
        url,
        {
          // 可选，默认为http.RequestMethod.GET
          method: http.RequestMethod.POST,
          extraData: data,
          // 开发者根据自身业务需要添加header字段
          header: {
            'Content-Type': 'application/json'
          },
          // 可选，指定返回数据的类型
          expectDataType: http.HttpDataType.OBJECT,
          // 可选，默认为true
          usingCache: true,
          // 可选，默认为1
          priority: 1,
          // 可选，默认为60000ms
          connectTimeout: 60000,
          // 可选，默认为60000ms
          readTimeout: 60000,
        }
      )
      if (response.responseCode == http.ResponseCode.OK) {
        return response.result as T
      } else {
        Prompt.showToast({ message: `请求错误:${response.responseCode}` })
        return undefined
      }
    } catch (e) {
      Prompt.showToast({ message: `请求错误` })
      return undefined
    }
  }

  /**
   * post请求，同步
   */
  static async postSync(url: string, data: any): Promise<string> {
    // 每一个httpRequest对应一个HTTP请求任务，不可复用
    let response = await http.createHttp().request(
      // 填写HTTP请求的URL地址，可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      url,
      {
        // 可选，默认为http.RequestMethod.GET
        method: http.RequestMethod.POST,
        extraData: data,
        // 开发者根据自身业务需要添加header字段
        header: {
          'Content-Type': 'application/json'
        },
        // 可选，指定返回数据的类型
        expectDataType: http.HttpDataType.STRING,
        // 可选，默认为true
        usingCache: true,
        // 可选，默认为1
        priority: 1,
        // 可选，默认为60000ms
        connectTimeout: 60000,
        // 可选，默认为60000ms
        readTimeout: 60000,
      }
    )
    if (response.responseCode == http.ResponseCode.OK) {
      return response.result as string
    } else {
      Prompt.showToast({ message: `请求错误:${response.responseCode}` })
    }
  }

  /**
   * get请求
   */
  static get(
    url: string,
    onSuc: (data: any) => void,
    onErr: (msg: string) => void
  ) {
    // 每一个httpRequest对应一个HTTP请求任务，不可复用
    let httpRequest = http.createHttp();

    httpRequest.request(
      // 填写HTTP请求的URL地址，可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      url,
      {
        // 可选，默认为http.RequestMethod.GET
        method: http.RequestMethod.GET,
        // 开发者根据自身业务需要添加header字段
        header: {
          'Content-Type': 'application/json'
        },
        // 可选，指定返回数据的类型
        expectDataType: http.HttpDataType.OBJECT,
        // 可选，默认为true
        usingCache: true,
        // 可选，默认为1
        priority: 1,
        // 可选，默认为60000ms
        connectTimeout: 60000,
        // 可选，默认为60000ms
        readTimeout: 60000,
      },
      (err, data) => {
        if (!err) {
          onSuc(data.result)
        } else {
          onErr(err.message)
        }
        // 当该请求使用完毕时，调用destroy方法主动销毁
        httpRequest.destroy();
      }
    );
  }

  /**
   * get请求,同步
   */
  static async getSync(url: string): Promise<http.HttpResponse> {
    // 每一个httpRequest对应一个HTTP请求任务，不可复用
    return http.createHttp().request(
      // 填写HTTP请求的URL地址，可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      url,
      {
        // 可选，默认为http.RequestMethod.GET
        method: http.RequestMethod.GET,
        // 开发者根据自身业务需要添加header字段
        header: {
          'Content-Type': 'application/json'
        },
        // 可选，指定返回数据的类型
        expectDataType: http.HttpDataType.OBJECT,
        // 可选，默认为true
        usingCache: true,
        // 可选，默认为1
        priority: 1,
        // 可选，默认为60000ms
        connectTimeout: 60000,
        // 可选，默认为60000ms
        readTimeout: 60000,
      }
    );
  }

  /**
   * get请求,同步,优化
   */
  static async getSyncNew(url: string): Promise<string> {
    // 每一个httpRequest对应一个HTTP请求任务，不可复用
    let response = await http.createHttp().request(
      // 填写HTTP请求的URL地址，可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      url,
      {
        // 可选，默认为http.RequestMethod.GET
        method: http.RequestMethod.GET,
        // 开发者根据自身业务需要添加header字段
        header: {
          'Content-Type': 'application/json'
        },
        // 可选，指定返回数据的类型
        expectDataType: http.HttpDataType.STRING,
        // 可选，默认为true
        usingCache: true,
        // 可选，默认为1
        priority: 1,
        // 可选，默认为60000ms
        connectTimeout: 60000,
        // 可选，默认为60000ms
        readTimeout: 60000,
      }
    );
    if (response.responseCode == http.ResponseCode.OK) {
      return response.result as string
    } else {
      Prompt.showToast({ message: `请求错误:${response.responseCode}` })
    }
  }
}
